home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: Alpha / Whiteline Alpha.iso / progtool / gfabasic / gfa_bugs.txt
Encoding:
Text File  |  1994-09-22  |  28.0 KB  |  528 lines

  1. @(#) bugs.txt, Fehler in GFABASIC 3.x - Uwe Ohse, 15.4.93
  2.  
  3.  
  4.                Liste des Grauens - willkommen im Land der Bugs!
  5.  
  6.  
  7.      Dieser Text führt die mir bekannten fehlerhaften oder prinzipiell nicht
  8.      zukunftssicheren Befehle im GFABASIC 3.6. Er ist nicht als vollständig zu
  9.      betrachten! Die Anzahl mir unbekannter Fehler im GFABASIC 3.6 ist mög-
  10.      licherweise sehr hoch.
  11.  
  12. 1. Die GFA-Fensterverwaltung.
  13.    Die einfache Fensterverwaltung mit OPENW, CLOSEW usw. ist in früheren
  14.    Versionen fehlerhaft gewesen. Wie es heute aussieht, weiß ich nicht, da ich
  15.    schon lange auf direkte AES-Aufrufe umgestiegen bin.
  16.    Prinzipiell jedoch ist ein gravierender Mangel nicht beseitigt worden: Es
  17.    können mit den GFA-Fensterbefehlen nur bis zu vier Fenster verwaltet werden,
  18.    was in Zukunft ein ernsthafter Mangel werden dürfte.
  19.    Auch ist die GFA-Fensterverwaltung recht unflexibel.
  20.    Die GFA-Fensterverwaltung kann übrigens mit großen Fensterhandles (WINX,
  21.    MultiTOS) umgehen.
  22.  
  23. 2. Die Dateifunktionen unter Multitasking
  24.    Tritt bei OPEN ein Fehler auf, z.B. weil gerade ein anderer Prozess die
  25.    Datei gesperrt hat, so meldet GFABASIC sofort einen Fehler. Damit sind
  26.    die gesamten I/O-Operationen unter MTOS/MiNT ziemlich unsicher, und es
  27.    ist nicht möglich, z.B. zwei Bugsicprogramme auf denselben Datenbestand
  28.    loszulassen.
  29.    Für dieses Problem gibt es bisher keine Lösung außer der Verwendung des
  30.    GFA-nach-C-Konverters (gut, aber für den Hobbygebrauch etwas teuer) oder
  31.    einer selbstgeschriebenen Ein/Ausgabelibrary auf GEMDOS()-Basis. Letztere
  32.    verlangsamt das Programm recht stark, falls sie nicht in Assembler
  33.    realisiert wird.
  34.  
  35. 3. Bekannte Bugs, die nicht auf einen speziellen Befehl beschränkt sind
  36.    3.1 Allgemein
  37.    - GFABASIC verläßt sich darauf, daß VDI-Aufrufe den Inhalt von
  38.      CONTROL(6) (das Handle der Workstation) nicht verändern. Dies ist eine
  39.      undokumentierte Eigenschaft einiger VDI-Versionen, die andere Versionen
  40.      nicht teilen. Mit anderen Worten: Möglicherweise steht nach dem
  41.      Aufruf einer VDI-Funktion etwas ganz anderes in Control(6) als vorher.
  42.      Und beim nächsten Aufruf stimmt das Handle nicht -> im schlimmsten
  43.      Falle Crash!
  44.      Abhilfe: Nach _jedem_ VDI-Aufruf CONTROL(6) setzen, z.B. mit V~H=xxx.
  45.      (was definitiv zuviel verlangt ist, ich weiß)
  46.    - Außerdem unterscheidet sich die Syntax einiger VDI-Aufrufe (rund um
  47.      das Öffnen und Schließen von virtuellen oder physikalischen Workstations)
  48.      stark von der in anderen Sprachen gebräuchlichen.
  49.    3.2 Compiler
  50.    - Bitte "kommentieren" Sie mal einen Block oder eine Zeile in ihrem
  51.      Programm mit "IF FALSE" und "ENDIF" aus und compilieren sie es dann.
  52.      In vielen Fällen stürzt der Compiler während der Arbeit bombenwerfend
  53.      ab.
  54.    - Konstruktionen wie "IF exist(datei$)" können unter Umständen im
  55.      compilierten Programm falsch ausgewertet werden. Verwenden Sie besser
  56.      "IF exist(datei$)<>FALSE".
  57.      Dieser unangenehme Effekt ist mehr oder weniger unbekannt und nicht
  58.      beliebig reproduzierbar. Eines meiner Programme findet aber erst seit
  59.      der Änderung der EXIST-Bedingungen seine sämtlichen Dateien wieder.
  60.      Auch ein beim Mailboxprogramm Q_MAIL aufgetretener Effekt ist nur so
  61.      erklärbar gewesen. Eine Programmteil der Form
  62.      IF EXIST(zugriffsliste$)
  63.        [lesen der Liste]
  64.      ELSE
  65.        [neuanlegen der Liste]
  66.      ENDIF
  67.      führte ab und zu (wenn auch selten) dazu, daß eine existierende Liste
  68.      gegen die Defaultliste "ersetzt wurde".
  69.      Ähnliches für alle anderen "Vergleiche irgendwas" Bedingungen, also
  70.      auch für WHILE und UNTIL. Die Probleme lassen sich nicht vernünftig
  71.      reproduzieren (und schon gar nichts in ein paar Zeilen), sind aber
  72.      mittlerweile von genügend anderen Leuten bestätigt worden.
  73.    - in einem relativ großen Programm (undokumentiert 250 K) ist es
  74.      vorgekommen, daß der Compiler Funktionen nicht gefunden hat, wenn sie
  75.      hinter den Funktionen standen, aus denen sie aufgerufen wurden. Abhilfe
  76.      brachte es, die in der Hierarchie niedrigeren Funktionen vor den anderen
  77.      zu plazieren.
  78.    - TT? führt auf Geräten ohne Cookiejar zum Absturz, da hier einfach
  79.      unterstellt wird, daß eine FPU vorhanden ist.
  80.    3.3 Interpreter
  81.    - Der Interpreter greift in starkem Maße auf LineA zu. Schaltet man z.B.
  82.      unter NVDI das LineA ab, funktioniert der Interpreter nicht mehr.
  83.    - Er verbiegt auch Systemvektoren ohne die dafür vorgesehene Betriebs-
  84.      systemfunktion setexc zu verwenden. Damit ist er unter MiNT und MultiTOS
  85.      nicht mehr lauffähig. (Es sei denn, man patcht ihn. Siehe unten).
  86.    3.4 Linker
  87.    - Das Anlegen von Symboltabellen sollte man bei längeren Programmen
  88.      unterlassen. Der Linker kann abstürzen.
  89.    3.5 Speicherverwaltung in Interpreter und Compiler
  90.    - RESERVE arbeitet unter TOS 3.06 und MiNT nur unzureichend. Es kann den
  91.      einmal freigegebenen Speicher nicht wieder vergrößern. Dies war GFA
  92.      vor der Auslieferung von Bugsic 3.6 bekannt und ist nicht behoben
  93.      worden. Man denke darüber, wie man will.
  94.      Die einzige Abhilfe ist, auf eine dynamische Speicherverwaltung mit
  95.      Malloc umzusteigen. Leider unterstützt GFABASIC dies in keiner Weise.
  96.      Unter MultiTOS wird die damit erzwungene starre Speicherverwaltung
  97.      ärgerlich werden.
  98.    - Die Speicherverwaltung ist nicht nur unflexibel, sondern auch
  99.      fehlerhaft. Mit freundlicher Erlaubnis von Christoph Conrad @ AC3:
  100.  
  101.        Probieren Sie mal folgendes (danach neu booten):
  102.        ' Compilerversion mit $m statt RESERVE
  103.        RESERVE 1000
  104.        $m 4711
  105.        ' RESERVE damit's etwas schneller abstürzt, aber eigentlich unnötig.
  106.        ' Die (**) Zeilen braucht man beim Interpreter, damit nach dem RESERVE
  107.        ' auch wirklich (FRE() MOD 16) == 0 gilt
  108.        ' minus 4: wegen Backtrailer bei rest16$ beim Compiler falls $m XXXX
  109.        ' mit (XXXX MOD 16)<>0
  110.        rest16%=(FRE(0) MOD 16)-4   ! **
  111.        IF rest16%<0                ! **
  112.          ADD rest16%,16            ! **
  113.        ENDIF                       ! **
  114.        rest16$=STRING$(rest16%,0)  ! **
  115.        ' (FRE() MOD 16) == 0 jetzt erfüllt
  116.        str$="AHAH"
  117.        DO
  118.          @crash(str$)
  119.        LOOP
  120.        PROCEDURE crash(str$)
  121.          str$="OHOH"
  122.        RETURN
  123.  
  124.        ' (Der Bug ist nicht auf jedem Rechner zu jeder Zeit reproduzierbar,
  125.        '  z.B. tritt er auf meinem TT nicht auf, auf dem STE aber schon. Uwe)
  126.    - Ein weiterer Bug in der internen Speicherverwaltung tritt unter noch
  127.      selteneren Umständen auf, es ist mir bisher nicht gelungen, ihn in
  128.      kleineren Programmen zu reproduzieren. Er tritt im Zusammenhang mit der
  129.      Übergabe lokaler Variablen als Parameter an eine Prozedur oder
  130.      Funktionen besonders gerne auf, wenn man dabei Call-by-Reference- und
  131.      Call-by-Value-Parameter mischt und nach Möglichkeit auch Felder
  132.      übergibt.
  133.      Die Folgen reichen von kompletten Systemhängern bis zu einigermaßen
  134.      zivilisierten, aber vollkommen falschen Fehlermeldungen des Interpre-
  135.      ters.
  136.      Abhilfe: CbV- und CbR-Parameter nach Möglichkeit nicht mischen, Felder
  137.      nach Möglichkeit nur eine Prozedur tief hinunterreichen (?).
  138.  
  139.      Nachtrag:
  140.       PROCEDURE test
  141.         LOCAL a&
  142.         '
  143.         adr%=V:a&            !Adresse von a& vorher
  144.         PRINT adr%
  145.         '
  146.         a&=@zahl             !Funktion aufrufen
  147.         '
  148.         PRINT a&             !a& => falsch <= ERROR hier!
  149.         '
  150.         PRINT V:a&           !Adresse von a& nachher = verschoben!!
  151.         PRINT WORD(adr%)     !An der alten Adresse steht es
  152.       RETURN
  153.       FUNCTION zahl
  154.         DIM a$(10)           !Hier verschiebt sich die Adresse von a& !
  155.         RETURN 10
  156.       ENDFUNC
  157.       Ausgabe beispielsweise:
  158.       1000000 (beliebige, noch korrekte Adresse)
  159.       42      (irgendeine Zahl)
  160.       2000000 (beliebige Adresse ungleich der obigen)
  161.       10
  162.  
  163.       In anderen Fällen treten solche Probleme in der Funktion "zahl" auf,
  164.       wenn dort z.B. die Variable a benutzt wird.
  165.  
  166.      Konsequenz daraus: Vorsicht mit lokal deklarierten Feldern! (u.a.)
  167. Gruppe: GFABASIC
  168. ID  : A1724@PB2
  169. Kommentar zu A9378@OS
  170. Wg. : Bugs: Teil 2 (Befehle)
  171. Von : Uwe Ohse @ PB2 (Fr, 16.04.93 10:15)
  172.  
  173. 4. Diverse fehlerhafte oder unbrauchbare Befehle:
  174. Im folgenden bedeutet LA LINE-A!
  175. ACHAR:       ruft LA (Textblt) auf. Abhilfe: TEXT
  176. ACLIP:       ruft LA auf. Abhilfe: CLIP.
  177. AFTER:       hängt von $I+ ab und sollte deshalb vermieden werden. Abhilfe
  178.              bieten die AES-Events (EVNT_TIMER, EVNT_MULTI) oder zur Not auch
  179.              ON MENU.
  180. ALINE:       ruft LA (Arbitrary line) auf. Abhilfe: LINE
  181. APOLY:       ruft LA (Filled polygon) auf. Abhilfe. POLYLINE
  182. ARECT:       ruft LA (Filled rectangle) auf. Abhilfe: PBOX
  183. ATEXT:       ruft LA (TextBlt) auf. Abhilfe: TEXT
  184. BITBLT:      Die Varianten
  185.                    BITBLT adresse%
  186.              und
  187.                    BITBLT ein_feld%()
  188.              benutzen LA (Bitblt) und sind deshalb unsauber. Als Abhilfe
  189.              bietet sich die Benutzung von
  190.                    BITBLT q%(),z%(),d%()
  191.              an. Hier wird das VDI benutzt.
  192.              Anmerkung: Leider ist dies der einzige saubere
  193.              Rasterkopierbefehl, den Bugsic bietet.
  194. CALL:        Funktioniert im Interpreter nicht. Abhilfe bietet folgender
  195.              Patch von Christoph Conrad: (3.6 D TT - Groesse 104770)
  196.              Byte:
  197.                Dateioffset $34AC. Dort sollten die Bytes $48 $ E7 $ 00 $ 0A
  198.                zu finden sein.
  199.                Das $0A in $0E umpatchen, das wars.
  200. CRSCOL:      greift auf LA-Variablen zu. Abhilfe: Keine. Es sollte aber nicht
  201.              schwierig sein, sich die Cursorposition zu merken!
  202. CRSLIN:      greift auf LA-Variablen zu. Siehe CRSCOL.
  203. DEFMOUSE:    greift auf LA zu, um die Mausform sofort zu ändern. Schaltet man
  204.              unter NVDI das LA ab, wird die Mausform erst bei der nächsten
  205.              Mausbewegung geändert. Abhilfe: GRAF_MOUSE() (ist sowieso
  206.              sauberer).
  207. EVERY:       hängt von $I+ ab und sollte vermieden werden. Abhilfe: Siehe
  208.              AFTER.
  209. EXEC:        Modus 4 funktioniert offenbar nur zufällig.
  210. FILESELECT:  schaltet die Maus mit LA ab. Abhilfe: FSEL_(EX)INPUT benutzen.
  211. GET:         in einen String passen nur 32K, und das reicht schon unter
  212.              Overscan u.U. nicht mehr aus. Man sollte sich auch nie
  213.              darauf verlassen, daß 100*100 Pixel in den String passen: Es
  214.              könnte z.B. eine TrueColor-Karte laufen. Weiterhin benutzt
  215.              GET die LineA-Variable M_HID_CT und Logbase (XBios(3)).
  216.              Abhilfe: VDI-BITBLT.
  217. HIDEM:       ruft LA (Hide mouse) auf. Abhilfe: GRAF_MOUSE()
  218. HLINE:       ruft LA (Horizontal line) auf. Abhilfe: LINE.
  219. INPUT:       greift u.U. auf LA-Variablen zu. Leider hilft es auch nicht, CON:
  220.              zum Lesen zu öffnen und INPUT # zu benutzen: So schlau ist Bugsic
  221.              leider. Abhilfe: In GEM-Programmen Dialoge benutzen oder gleich in
  222.              Fenstern arbeiten, in TOS-Programmen GEMDOS(10,...) (=Cconrs)
  223.              benutzen.
  224.              Nachtrag: Es hilft auch, mit INPUT # von "STD:" zu lesen, diese
  225.              Variante benutzt kein LA und ermöglicht auch eine I/O-Umlenkung.
  226.              In GEM-Programme passt sie allerdings nicht (dasselbe gilt
  227.              allerdings auch für INPUT).
  228. INP?:        benutzt LA. Abhilfe: BIOS(1,device)
  229. INSTR:       Die Varianten INSTR("xyz","xyz",2) und INSTR(2,"xyz","xyz")
  230.              liefern 1 zurück, obwohl "xyz" in "yz" nicht vorhanden ist.
  231. KEYDEF:      hängt von $I+ ab und ist deshalb zu meiden. Abhilfe: in
  232.              GEM-Programmen simpel, bei Eintreffen eines Tastaturereignisses
  233.              statt der Funktionstaste die entsprechenden Strings verarbeiten.
  234.              In TOS-Programmen wird es schwieriger, ich persönlich glaube auch
  235.              nicht, daß die benutzung der Funktionstasten in reinen
  236.              TOS-Programmen schön ist und gebe hierzu konsequenterweise
  237.              keinen Tip.
  238. L~A:         die Basisadresse der LA-variablen persönlich. Sozusagen der
  239.              Teufel selbst. Für die allermeisten Zwecke braucht man sowieso
  240.              keinen Zugriff darauf. Wenn doch, tja, dann muß man halt.
  241. MOUSE,
  242. MOUSEX,
  243. MOUSEY,
  244. MOUSEK:      greifen auf LA-Variablen zu. Abhilfe bietet mal wieder das AES,
  245.              wenn man auf Mausereignisse abfragt (EVENT_MULTI, EVENT_BUTTON,
  246.              EVENT_MOUSE) oder (einfacher) GRAF_MKSTATE verwendet.
  247. POS():       benutzt zwar kein LA, ist aber trotzdem unbrauchbar, da es ganz
  248.              einfach "Anzahl der seit dem letzten Carriage Return ausgegebenen
  249.              Zeichen modulo 256" zurückzugibt und nicht die tatsächliche
  250.              Cursorposition!
  251. PRINT:       gibt normalerweise über das BIOS aus. Arbeitet man aber mit
  252.              PRINT#x, wenn x mit OPEN "O",x,"STD:" geöffnet ist, wird über
  253.              die Standardausgabe ausgegeben. Diese Variante ist für Tools,
  254.              bei denen eine Ein/Ausgabeumlenkung denkbar ist, vorzuziehen!
  255.              PRINT auf Bildschirm oder STD: Hat in GEM-Programmen zu nichts
  256.              zu suchen!
  257. PSET:        ruft LA (Put pixel) auf. Abhilfe: PLOT
  258. PTST:        ruft LA (Get pixel) auf. Abhilfe: POINT()
  259. PUT:         Da GET nicht ausreichend verläßlich arbeitet, ist auch PUT nicht
  260.              zu gebrauchen.
  261. RC_COPY:     ruft LA (BltBlt) auf. Abhilfe: Siehe BITBLT.
  262. RESERVE:     ist fehlerhaft. Unter TOS 3.06 und MiNT kann RESERVE den Speicher
  263.              nicht wieder vergrößern. Abhilfe: Möglichst nur einen RESERVE
  264.              benutzen, nämlich den zum Verkleinern des Arbeitsspeichers, oder
  265.              diese Option zumindest unter MiNT/TOS3.06 anbieten, oder auf
  266.              dynamische Speicherverwaltung mittels MALLOC umsteigen.
  267. RESUME:      hängt von $I+ ab und sollte deshalb vermieden werden. Abhilfe:
  268.              RESUME label. Auch hier heißt es aufpassen, da bei RESUME label
  269.              der GFA-interne Stack inkonsistent wird. Ein Rücksprung (RETURN)
  270.              aus einem Unterprogramm ist deshalb nicht sicher möglich, der
  271.              RESUME label sollte also in eine Prozedur führen, die nicht wieder
  272.              verlassen werden muß, z.B. das Hauptprogramm.
  273.              (Ich erbitte mir Tips hierzu!)
  274. RESUME NEXT: hängt von $I+ ab und sollte deshalb vermieden werden. Abhilfe:
  275.              Siehe RESUME.
  276. SETCOLOR:    benutzt das XBIOS. Getreu der Regel, daß man Betriebssystemaufrufe
  277.              unterschiedlicher Ebenen nicht mischt, sollte man stattdessen
  278.              VSETCOLOR verwenden, wenn man mit den VDI-Aufrufen zeichnet.
  279. SETMOUSE:    ändert LA-Variablen.  Abhilfe: APPL_TPLAY, leider deutlich
  280.              komplizierter.
  281. SGET:        in einen String passen nur 32K, und das reicht schon unter
  282.              Overscan ganz sicher nicht aus. Abhilfe: VDI-BITBLT.
  283. SPUT:        Wenn SGET nicht zu gebrauchen ist, fällt auch SPUT aus.
  284. SHOWM:       ruft LA (Show mouse) auf. Abhilfe: GRAF_MOUSE
  285. SPRITE:      ruft LA (Draw sprite, Undraw sprite) auf. Abhilfe: viel
  286.              Mehrarbeit. Im allgemeinen benötigt man Sprites sowieso nur in
  287.              Spielen, und für die gelten andere Regeln.
  288. STE?:        Arbeitet grob fehlerhaft: Ist kein Cookiejar angelegt, so ange-
  289.              nommen, das Programm liefe auf einem ST, sonst wird der Cookie
  290.              _SND abgefragt, ob das Bit für Stero/DMA-Sound gesetzt ist.
  291.              Somit macht Bugsic von der Soundhardware abhängig, auf welcher
  292.              Maschine das Programm läuft. Was passiert auf dem Falcon? Mög-
  293.              licherweise alles schlechte der Welt.
  294.              Abhilfe: Den _MCH-Cookie selbst abfragen.
  295. STICK:       sollte vermieden werden. Unter MultiTOS dürfte es sehr unschön
  296.              sein, wenn eine Applikationen den Mausport als Joystick schaltet.
  297. STICK():     Benutzt KbdvBase = XBios(34) und Bconout(Ikbdsys) = Bios(3,4,...),
  298.              und schaltet die Maus auf die Hardwarenaheste Weise ab. Damit
  299.              sollte die Funktion unter MultiTOS nicht mehr genutzt werden.
  300. STRIG():     Siehe STICK().
  301. TT?:         arbeitet fehlerhaft und führt unter bestimmten Umständen zum
  302.              Absturz des Programms (fehlender Cookiejar, bzw. fehlender
  303.              Cookie). btw: Wie arbeitet TT? eigentlich genau? _FPU, _CPU?
  304.              Außerdem überschreibt TT? Teile des Programmcodes, ein
  305.              Verfahren, das nun wirklich schmutzig ist. Selbstmodifizierende
  306.              Programme sind MEGA-OUT!
  307.              Verschiedentlich wurde auch berichtet, daß bei Benutzung von TT?
  308.              größere Teile des Programmes überschrieben wurden. Nach kurzem
  309.              Debuggen des entsprechenden Routine kann ich das weder
  310.              ausschließen noch erhärten.
  311. VDIBASE:     Die Funktion liefert m.W. seit TOS 1.02 keine vernünftigen Werte
  312.              zurück. Abhilfen: Work_out-Feld, vqt_extend().
  313. XBIOS():     XBIOS(2 ... 5) sollten nicht mehr genutzt werden. Die Abfrage und
  314.              das Setzen der Bildschirmadresse kann auf diversen Graphikkarten
  315.              nicht funktionieren, XBIOS(4) ist nur für die Standardauflösungen
  316.              definiert.
  317. _C,
  318. _X,
  319. _Y:          Liefern im compilierten Programm 0 zurück. Abhilfe: In
  320.              GEM-Programmen entweder die Werte aus dem WORT_OUT-Feld
  321.              benutzen oder, besser noch, den Bereich des Hintergrundfensters
  322.              mit WIND_GET erfragen. Die Anzahl der Farbebenen kann man z.B.
  323.              dem AES-Globalfeld entnehmen.
  324.              Übrigens ist dieser Fehler (wie auch diverse andere) GFA seit
  325.              über einem Jahr bekannt.
  326.  
  327. Hinweis a): Mir ist klar, daß STICK und STRIG für Spiele durchaus noch eine
  328.    Existenzberechtigung haben. Unter GEM jedoch sollte man darauf verzichten!
  329. Hinweis b): Auch wenn man keine LA-Befehle verwendet, rufen sowohl der
  330.    Interpreter als auch der Compiler LA auf. Abhilfe schafft nur ein Patch,
  331.    siehe dazu unter Punkt 7.
  332. Gruppe: GFABASIC
  333. ID  : A1725@PB2
  334. Kommentar zu A9378@OS
  335. Wg. : Bugs: Teil 3
  336. Von : Uwe Ohse @ PB2 (Fr, 16.04.93 10:17)
  337.  
  338. 5. Compileroptionen:
  339. - $B+  "Fängt Bombenfehler ab"
  340.   Hierfür werden diverse Vektoren verbogen. Die Anwendung dieser Option in
  341.   Accessoires verbietet sich also von selbst ("Accessoires should not steal
  342.   vectors"), sonst hagelt es Abstürze beim Auflösungswechsel.
  343.   Es ist eigentlich überflüssig zu bemerken, daß selbstverständlich weder XBRA
  344.   noch SETEXC verwenden wird. Also darf diese Option unter MiNT nicht verwendet
  345.   werden, oder der Absturz unter MiNT (und MultiTOS) ist nur eine Frage von
  346.   Millisekunden.
  347. - $I+ "Interruptroutinen einschalten"
  348.   verbiegt Kbdvbase()->ikbdsys. Verbietet sich in Accessoires also ebenfalls.
  349.   Auch hier wird natürlich weder XBRA noch setexc benutzt, und unter MiNT
  350.   lauffähig sind Programme, die mit dieser Option compiliert wurden, auch
  351.   nicht. Diese Option sollte man also ebenfalls besser nicht setzen.
  352.   Aber: Das Setzen von $I- führt zu einigen Nebenwirkungen:
  353.   -- Every und After können nicht mehr benutzt werden. Im Ernstfall kann man
  354.      sie aber über EVNT_TIMER() nachbilden.
  355.   -- CTRL/ALT/SHIFT funktioniert nicht mehr (kein Verlust, ist unter MiNT
  356.      sowieso nicht zu gebrauchen)
  357.   -- RESUME und RESUME NEXT werden unbenutzbar. Einzig RESUME marke kann noch
  358.      verwendet werden, löscht aber den bugsicinternen Stack und sollte nur ins
  359.      Hauptprogramm oder eine Prozedur, die garantiert nicht per RETURN
  360.      verlassen wird, führen.
  361. -- $m Speicherbedarf festlegen
  362.   $m bestimmt den Speicherplatz, den das compilierte Programm für Variablen
  363.   und als Stack etc. verwenden soll. Nicht dazu zählt der Platz für
  364.   Programmcode und Konstanten (Strings, Festzahlen ...). Ein $m5000
  365.   beschränkt also den Platz im BSS-Segment auf 5000 Bytes und sorgt auch
  366.   dafür, daß das compilierte Programm nicht noch weiteren Speicher mit Malloc
  367.   an sich reißt.
  368.   Sehr sinnvoll ist diese Option für Programme, die unter Multitos laufen
  369.   sollen oder Accessoires. [Siehe außerdem RESERVE]
  370.  
  371.   Es gibt keine Möglichkeit, aus Bugsic herauszukitzeln, wieviel Speicher ein
  372.   Programm denn benötigt. Die Mühe muß man sich leider selbst machen.
  373.   - Man könnte im Interpreter in einer mit EVERY "kleiner Zeitabschnitt"
  374.     aufgerufenen Funktion das Maximum gleichzeitig belegten Speichers
  375.     bestimmen.
  376.   - Natürlich kann man sich diesen Wert auch berechnen. In der Praxis ist das
  377.     relativ einfach, da man sein Programm ja schließlich ordentlich
  378.     vorbereitet hat und dabei natürlich aus der Programmdokumentation den
  379.     Umfang aller Variablen und Strukturen sowie ihre Lebenszeit entnehmen
  380.     kann ;-)
  381.   Auf jeden Fall sollte man eine ausreichende Sicherheitsspanne dazurechnen,
  382.   denn aufgrund von Speichermangel entstehende Fehler können sehr schwer zu
  383.   finden sein.
  384.  
  385.   Faustformel:
  386.    Der benötigte Arbeitsspeicher ist
  387.       "maximaler Speicherverbrauch aller Variablen und Felder"
  388.       plus "Stackplatz"
  389.       plus "sonstiger Verwaltungskram"
  390.       plus "IO-Puffer"
  391.       plus "Sicherheitsreserve".
  392.  
  393.    Speicherverbrauch der Variablen und Felder: Kann nur abgeschätzt werden
  394.    (mankann aber auch mal mit EVERY danach forschen).
  395.    Stackplatz: Sollte man recht hoch ansetzen, wenn man ein tief
  396.    verschachteltesoder gar rekursives Programm hat. In letzterem Fall sollte
  397.    man auch noch mal genauer über den Speicherbedarf der lokalen Variablen
  398.    nachdenken!
  399.    Sonstiger Verwaltungskram: Was Bugsic halt so braucht, z.B. den Platz für
  400.    AES- und VDI-Parameterfelder. 5K reichen aber locker.
  401.    IO-Puffer: Für jedes mit OPEN geöffnete File braucht Bugsic 4K Speicher.
  402.    Reserve: Ein Sicherheitsabstand von ein paar K sollte für den Fall, daß mal
  403.    mehr Speicher benötigt wird, als man gedacht hat, immer eingeplant werden.
  404.  
  405.    Der Speicherplatz für Resourcen wird mit "Malloc" alloziert, er braucht für
  406.    $m also nicht berechnet zu werden. Denke aber daran, daß Resourcen bei ACC's
  407.    frühzeitig geladen werden müssen - wie auch alle Mallocs am Programmstart
  408.    getätigt werden müssen (erste AES-Aktion am Programmbeginn:
  409.    WIND_UPDATE(BEG_UPDATE), RSC_LOAD(), MALLOC(), WIND_UPDATE(END_UPDATE)).
  410.  
  411.    Inlines stehen übrigens im Programmtext und brauchen also nicht berechnet
  412.    zu werden.
  413.  
  414. 6. Verschiedenes:
  415. - das INTIN-Array ist auf 120 Elemente begrenzt. Daraus ergibt sich, daß
  416.   der Befehl TEXT nur Zeichenketten mit bis zu 120 Zeichen ausgeben kann, der
  417.   Rest wird abgeschnitten.
  418.   Ähnliches gilt für POLYLINE.
  419.   Generell gilt dies für alle Befehle, die viele Koordinaten an das VDI
  420.   übergeben. Das ist kein Bug, nur eine Beschränkung.
  421.  
  422. 7. Hinweise auf weitere Quellen in rein zufälliger Reihenfolge:
  423. - Von Karsten Isakovic (Maus Berlin) kreist ein Text mit Tips über
  424.   auflösungsunabhängiges Programmieren durch die Mailboxen. Unbedingt
  425.   empfehlenswert!!!
  426.   Er liegt zum Beispiel in der Quark Paderborn im Brett "Textfiles allgemein"
  427.   als "PRG_TIPS.LZH".
  428. - Von Christoph Conrad (Maus Aachen 3) stammt eine Anleitung zum Patch des
  429.   Compilers (genauer der Lib.) und Interpreters 3.6. Damit gelinkte
  430.   Programme rufen keine LineA mehr auf, wenn der Programmierer die
  431.   im Abschnitt 2 angegebenen LA-aufrufenden Befehle nicht verwendet.
  432.   Auf der Grundlage dieser Anleitung habe ich ein Programm geschrieben, das
  433.   die Patches an Interpreter und Compiler selbst durchführt. Es liegt als
  434.   Buglafix.Zoo im Brett ST-Tools in der Quark Paderborn (05251/71409,
  435.   Gastdownload frei).
  436. - Dann ist da noch die Professional-GEM-Serie von Tim Oren, die in vielen
  437.   Mailboxen als PROGEM.LZH oder PRO_GEM.LZH zu finden ist. So unter anderem
  438.   in der Quark Paderborn im Brett Textfiles Allgemein.
  439.   Tim Oren ist einer der GEM-Programmierer, schon alleine deshalb ist der
  440.   Text lesenswert. Er enthält allerhand wertvolle Tips.
  441. - Um den Interpreter unter MiNT zum Laufen zu bekommen, habe ich einen
  442.   Patch der Kategorie "brutal und wirksam" geschrieben. Zumindest auf
  443.   meinem TT funktioniert er, wenn auch prinzipbedingt deutlich instabiler
  444.   als ein ungepatchter Interpreter. (Quark PB, Brett ST-TOOLS,
  445.   Bugmntfx.zoo).
  446. - Um den Interpreter auch auf Graphikkarten wenigstens grundsätzlich zum
  447.   Laufen zu bekommen, hat Frank Baumgart ein Tool geschrieben, das die
  448.   diversen setscreens abfängt. Es liegt als BUGSSFIX.LZH im Brett ST-Tools in
  449.   der Quark Paderborn.
  450.  
  451.   Falls jemand glaubt, ich mache Werbung für die Quark PB: So ist es :-)
  452.  
  453. 8. Programmierung von Accessoires
  454.   - Wie oben schon erwähnt: Die Benutzung von $B+ und $I+ ist verboten und
  455.     führt beim Auflösungswechsel zum Absturz.
  456.   - Das Beispiel-ACC im Handbuch zu Version 3.0 auf den Seiten 52 bis 53 ist
  457.     fehlerhaft, der Block
  458.       CASE 22,41
  459.         CLOSEW#1
  460.         exit!=TRUE
  461.     sollte ersetzt werden in
  462.       CASE 22
  463.         CLOSEW#1
  464.         exit!=TRUE
  465.       CASE 41
  466.         exit!=TRUE
  467.     Bei Eintreffen der Message 41 (AC_CLOSE) ist das Fenster schon
  468.     geschlossen!
  469.   - RESERVE ist im ACC's VERBOTEN! Ebenso muß man mit Malloc vorsichtig sein,
  470.     da vom ACC's allozierter Speicher dem Hauptprogramm zugerechnet wird, und
  471.     bei Beendigung der Applikation freigegeben wird.
  472.     Wenn aber das allozieren von Speicher unbedingt notwendig ist, sollte man
  473.     aber den WIND_UPDATE-Trick von Laurenz Prüßner verwenden.
  474.   - Accessoires haben keine vollständige Basepage. Man sollte sich auf die
  475.     Werte darin nicht verlassen.
  476.   - Accessoires sind keine echten GEMDOS-Prozesse. Daraus ergeben sich eine
  477.     Reihe unerfreulicher Folgen, eine davon haben wir oben schon kennen-
  478.     gelernt (das Speicherproblem). Weitere Probleme:
  479.     - die DTA (benutzt für FSFIRST/FSNEXT/EXIST) ist defaultmäßig dieselbe,
  480.       die das laufende Hauptprogramm benutzt. Chaos kann die Folge sein!
  481.       In Accessoires sollte es üblich sein, vor allen DTA-Operationen die
  482.       DTA zu setzen!
  483.     - ACCs können (ohne größeren Aufwand und schmutzige Tricks) keine
  484.       Programme starten.
  485.  
  486. 9. Programmierung MiNT- und MultiTOS-fester Programme
  487.   - $I+ und $B+ sind unter MiNT tödlich
  488.   - RESERVE kann nur einmal zum Verkleinern des Speichers benutzt werden,
  489.     $m ist vorzuziehen
  490.   - man darf keineswegs auf fremden Speicher zugreifen
  491.   - Es ist nicht gesagt, daß zwei direkt nacheinander geMALLOCte
  492.     Speicherblöcke im direkt aufeinander folgen
  493.   - Fensterhandles können größer als nur 7 werden (MTOS)
  494.   - Fensterelemente können auch im Hintergrund bedient werden.
  495.   Programmiertip: Wird ein Pfeil oder ein Scrollbalken eines im Hintergrund
  496.   liegenden Fensters betätigt, kann man die neuzuzeichnenden Teile des
  497.   Fensters aus der Rechteckliste holen.
  498.  
  499. 10. disclaimer: Ich, Uwe Ohse, übernehme keine Verantwortung für Korrektheit
  500.   oder Vollständigkeit dieser Tips. Sollte sich durch ihre Anwendung irgendein
  501.   Problem ergeben, bin ich, egal welches Art es ist und wie schlimm es auch
  502.   sein mag, in keiner Weise dafür verantwortlich.
  503.  
  504. 11. Dieser Text ist auf Grundlage meines heutigen Wissens entstanden. Ich bin
  505.   gerne bereit, ihn zu korrigieren und zu ergänzen. Dazu brauche ich
  506.   natürlich Mitarbeit!
  507.   Die jeweils aktuellste Version dieser Mängelliste wird immmer im  Brett 120
  508.   (Textfiles allgemein) in der Quark Paderborn liegen.
  509.  
  510. 12. Alternativen:
  511.   - Pure C (sehr schnell Compiler, sehr guter Debugger, sehr gute Onlinehilfe)
  512.   - Lattice C (sehr gute Bibliotheken, schneller Compiler, hoch portabel,
  513.     Weiterentwicklung fraglich)
  514.   - GNU C (sehr gute Bibliotheken, langsamer Compiler, hoch portabel,
  515.     kostenlos, alle Sourcen erhältlich, kein funktionierender Debugger, C++ )
  516.   - Hänisch Modula II (schnell, Onlinehilfe, sehr gute Libs, für Modula
  517.            sehr portabel)
  518.   - Pure Pascal (Turbo 6.0 kompatibel, sehr guter Debugger, Onlinehilfe,
  519.            sehr schnell, Oberfläche Gift für MTOS)
  520.   - GFA 4.0, sobald es fertig ist, könnte eine werden.
  521.  
  522.   Für die C-Compiler gibt es mittlerweile eine Unzahl von Librarys, mit denen
  523.   man fast alle Probleme erschlagen kann. U.A. gibt es die MiNTLib, die eine
  524.   MiNT-Unterstützung liefert, ohne daß die Programmierer etwas daran tun
  525.   müßte, und auch garantiert, daß das Programm unter reinem TOS lauffähig ist.
  526.   Der erzeugte Code ist bei allen oben genannten Systemen gut bis sehr gut.
  527.  
  528.